/**
 * Created by PanJiaChen on 16/11/18.
 */

/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string}
 */
export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null;
  }
  const format = cFormat || "{y}-{m}-{d} {h}:{i}:{s}";
  let date;
  if (typeof time === "object") {
    date = time;
  } else {
    if (typeof time === "string" && /^[0-9]+$/.test(time)) {
      time = parseInt(time);
    }
    if (typeof time === "number" && time.toString().length === 10) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay(),
  };
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key];
    // Note: getDay() returns 0 on Sunday
    if (key === "a") {
      return ["日", "一", "二", "三", "四", "五", "六"][value];
    }
    if (result.length > 0 && value < 10) {
      value = "0" + value;
    }
    return value || 0;
  });
  return time_str;
}

/**
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime(time, option) {
  if (("" + time).length === 10) {
    time = parseInt(time) * 1000;
  } else {
    time = +time;
  }
  const d = new Date(time);
  const now = Date.now();

  const diff = (now - d) / 1000;

  if (diff < 30) {
    return "刚刚";
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + "分钟前";
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + "小时前";
  } else if (diff < 3600 * 24 * 2) {
    return "1天前";
  }
  if (option) {
    return parseTime(time, option);
  } else {
    return (
      d.getMonth() +
      1 +
      "月" +
      d.getDate() +
      "日" +
      d.getHours() +
      "时" +
      d.getMinutes() +
      "分"
    );
  }
}

/**
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj(url) {
  const search = url.split("?")[1];
  if (!search) {
    return {};
  }
  return JSON.parse(
    '{"' +
      decodeURIComponent(search)
        .replace(/"/g, '\\"')
        .replace(/&/g, '","')
        .replace(/=/g, '":"')
        .replace(/\+/g, " ") +
      '"}'
  );
}

export function isJSON(val) {
  if (typeof val !== "string") {
    return false;
  }
  try {
    const obj = JSON.parse(val);
    if (Object.prototype.toString.call(obj) === "[object Object]") {
      return true;
    } else {
      return false;
    }
  } catch (e) {
    return false;
  }
}

export function filterParam(data) {
  const _filterParam = [
    (data) => {
      const obj = {};
      for (const k in data) {
        if (data[k] !== undefined && data[k] !== "") {
          obj[k] = data[k];
        }
      }
      return obj;
    },
  ];
  return _filterParam.reduce((data, fn) => fn(data), data);
}

const LOG_PREFIX = "trtc-callling-webrtc-demo:";

export function isValidatePhoneNum(phoneNum) {
  const reg = new RegExp("^1[0-9]{10}$", "gi");
  return phoneNum.match(reg);
}

export function isUserNameValid(username) {
  return username && username.length <= 20;
}

export function setUserLoginInfo({ token, phoneNum }) {
  localStorage.setItem("userInfo", JSON.stringify({ token, phoneNum }));
}

export function addToSearchHistory(searchUser) {
  const MAX_HISTORY_NUM = 3;
  let searchUserList = getSearchHistory();
  const found = searchUserList.find(
    (user) => user.userId === searchUser.userId
  );
  if (!found) {
    searchUserList.push(searchUser);
  }
  if (searchUserList.length > MAX_HISTORY_NUM) {
    searchUserList = searchUserList.slice(-MAX_HISTORY_NUM);
  }
  localStorage.setItem("searchHistory", JSON.stringify(searchUserList));
}

export function getSearchHistory() {
  try {
    return JSON.parse(localStorage.getItem("searchHistory") || "[]");
  } catch (e) {
    return [];
  }
}

export function getUserLoginInfo() {
  try {
    return JSON.parse(localStorage.getItem("userInfo") || "{}");
  } catch (e) {
    return {};
  }
}

export function log(content) {
  console.log(`${LOG_PREFIX} ${content}`);
}

export function getRandomNum() {
  var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  let nums = "";
  for (let i = 0; i < 32; i++) {
    const id = parseInt(Math.random() * 10);
    nums += arr[id];
  }
  return nums;
}

/**
 * @description 判断该值是不是一个空值
 * @param {any} val
 */
export function isDef(val) {
  return val !== null && val !== undefined;
}

export function getQueryString(name) {
  const reg = new RegExp("(^|&|\\?)" + name + "=([^&]*)(&|$)", "i");
  const r = window.location.href.match(reg);
  if (r != null) {
    return decodeURIComponent(r[2]);
  }
  return null;
}

export function getPrefixUrl() {
  const currentURL = window.location.href;
  const extractedURL = new URL(currentURL);
  const prefixUrl = extractedURL.origin;
  return prefixUrl;
}
